package com.tensai.study.java.basic.undercourse.泛型擦除;

import java.util.ArrayList;

/**
 * @author Tensai
 */
public class Test {

    /**
     * 泛型信息被擦除 所以两者getClass是true
     */
    @org.junit.Test
    public void t1() {

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("abc");

        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(123);

        System.out.println(list1.getClass() == list2.getClass());
    }

    /**
     * 在程序中定义了一个ArrayList泛型类型实例化为Integer对象，
     * 如果直接调用add()方法，那么只能存储整数数据，
     * 不过当我们利用反射调用add()方法的时候，却可以存储字符串，
     * 这说明了Integer泛型实例在编译之后被擦除掉了，只保留了原始类型。
     * @throws Exception
     */
    @org.junit.Test
    public void t2() throws Exception {

        ArrayList<Integer> list = new ArrayList<Integer>();

        //这样调用 add 方法只能存储整形，因为泛型类型的实例为 Integer
        list.add(1);

        list.getClass().getMethod("add", Object.class).invoke(list, "asd");

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
